// 加载 db 模块
const db = require('../db')

// 加载加密模块
const utility = require('utility');

// 加载 jsonwebtoken 模块
const jwt = require('jsonwebtoken');

// 登录 和 注册 的路由
// 1. 加载 express 模块
const express = require('express');
const { md5 } = require('utility');
// 2. 创建路由对象  (实际路由对象的数据类型是函数)
const router = express.Router();
// 3. 把路由（接口）挂载到路由对象上

// ====================== 定义验证规则 ============================
// 定义验证的错误对象
// class ValidationError extends Error {
//     constructor(x) {
//         super();
//         this.name = 'ValidationError';
//         this.message = x;
//     }
// }
const Joi = require('@hapi/joi');
const validator = require('express-joi-validation').createValidator({
    passError: true, // true 表示错误 next(err)
});
// 定义验证规则
const loginSchema = Joi.object({
    username: Joi.string().required().error(new Error('用户名必填')),
    password: Joi.string().min(6).max(12).required().error(new Error('密码长度必须是6~12位')),
})

// ========================= 登录接口 =============================
router.post('/login', validator.body(loginSchema), async (req, res) => {
    // 客户端接收到的 username password  判断账号密码是否正确
    // 加密密码
    let arr = [req.body.username, md5(req.body.password)];
    // 根据账号密码查询。如果查询到说明账号密码正确否则密码错误
    let r = await db('select * from user where username=? and password=?', arr);
    if (r && r.length > 0) {
        res.send({
            status: 0,
            message: '登录成功',
            token: 'Bearer ' + jwt.sign(
                { id: r[0].id },        // token 中保存的数据
                'kkkk',               // 用于加密的 key  最后解密的时候还会需要
                {
                    expiresIn: '2 days'  // token 的有效期为 2 天
                })
        })
    } else {
        res.send({
            status: 1,
            message: '账号或密码有误，登录失败',
        })
    }
});

// ========================= 注册接口 =============================
router.post('/reguser', validator.body(loginSchema), async (req, res) => {
    // 客户端提交账号，密码到达接口
    // 判断账号是否存在
    let r2 = await db('select * from user where username=?', req.body.username);
    // 查询到 r2 是一个数组  
    if (r2 && r2.length > 0) {
        res.send({ status: 1, message: '用户名已存在' });
        return
    }
    // 添加数据之前，把密码加密
    req.body.password = utility.md5(req.body.password)
    // 需要把账号密码提交到 user 表中
    let r = await db('insert into user set ?', req.body);
    if (r && r.affectedRows > 0) {
        res.send({ status: 0, message: '注册成功' })
    } else {
        res.send({ status: 1, message: '注册失败' })
    }
});

// 4. 导出路由模块
module.exports = router;